package com.example.jianbing.collection;

/**
 * @ClassName : NoSafeDemo
 * @Description :
 * @Author : JB
 * @Date: 2020-08-06 00:22
 */

import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/***
 * 题目： 请举例说明集合类是不安全的
 * 1. 故障现象
 *     java.util.ConcurrentModificationException 并发修改
 * 2. 导致原因
 *
 * 3. 解决方案
 *      3.1 Vector
 *      3.2 Collections.synchronizedList(new ArrayList<>())
 *      3.3 new CopyOnWriteArrayList<>();   在juc中 （java.util.concurrent）
 * 4. 优化建议
 *
 * 笔记：
 *     1. CopyOnWriteArrayList
 *        写时复制，读写分离，，写之前拿锁并复制一份给大家读，写完了更新并释放锁
 *     2. HashSet线程不安全 ，底层数据结构是HashMap
 *        HashSet的add调用了HashMap的put方法，add了一个key,value是PRESENT的常量对象
 *     3. HashMap  底层是 node结点的数组+单向链表+红黑树
 *        初始值16 负载因子0.75 超过12扩容（ArrayList扩容一半，HashMap扩容一倍）
 *      new ConcurrentHashMap<>()
 */
public class NoSafeDemo {
    public static void main(String[] args) {
        /*List<String> list = Arrays.asList("a","b","c");
        list.forEach(System.out::println);*/

        List<String> list = new CopyOnWriteArrayList<>();//Collections.synchronizedList(new ArrayList<>());//new Vector<>();//new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        for(String ele:list){
            System.out.println(ele);
        }

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }

    }
}
